在這一章中,我們將介紹 EVM 中與日誌相關的指令,包括 LOG0、LOG1、LOG2、LOG3 和 LOG4。我們也會設計一個用於處理日誌的 class。
#
# Logging
#
LOG0 = 0xA0
LOG1 = 0xA1
LOG2 = 0xA2
LOG3 = 0xA3
LOG4 = 0xA4
這些指令用於記錄合約執行過程中的日誌,可以用於事件通知和資訊記錄。
def log(self, num_topics):
mem_offset, length, *topics = [self.evm.stack.pop() for _ in range(num_topics + 2)]
data = self.evm.memory[mem_offset: mem_offset + length]
log_entry = {
"address": self.evm.address,
"data": data.hex(),
"topics": [f"0x{topic:064x}" for topic in topics]
}
self.evm.logs.append(log_entry)
這些指令允許合約在執行過程中生成日誌,並將其記錄到區塊鏈上。
以下是一個用於處理日誌的 class 範例:
class LogHandler:
def __init__(self, evm):
self.evm = evm
self.logs = []
def log(self, num_topics):
mem_offset, length, *topics = [self.evm.stack.pop() for _ in range(num_topics + 2)]
data = self.evm.memory[mem_offset: mem_offset + length]
log_entry = {
"address": self.evm.address,
"data": data.hex(),
"topics": [f"0x{topic:064x}" for topic in topics]
}
self.evm.logs.append(log_entry)
這個 class 允許合約進行日誌的處理和記錄,並將日誌存儲在 logs
屬性中。
在這一章中,我們介紹了 EVM 中與日誌相關的指令,包括 LOG0、LOG1、LOG2、LOG3 和 LOG4。我們也設計了一個用於處理日誌的 class。